package com.gsnd.gsnd22estore.service.impl;

import com.gsnd.gsnd22estore.domain.EsUser;
import com.gsnd.gsnd22estore.dto.*;
import com.gsnd.gsnd22estore.exception.BookStoreException;
import com.gsnd.gsnd22estore.mapper.EsUserMapper;
import com.gsnd.gsnd22estore.service.UserService;
import com.gsnd.gsnd22estore.utils.BeanCopyUtils;
import com.gsnd.gsnd22estore.utils.JsonWebTokenUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Date;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    EsUserMapper userMapper;
    @Override
    public LoginReturnDTO userLogin(UserLoginDTO userLd) {
        // 对userLd进行处理判断（主要是一些判空操作）
        // 因为判断用户名和密码是否为空的操作前端也能做，后端再一次进行验证
        if(userLd.getUsername()==null || userLd.getUsername().isEmpty()){
            // 抛出异常（当前用户名是空的，用户名不能为空）
            throw new BookStoreException(BookStoreException.CodeMsgEnum.USER_USERNAME_IS_NULL);
        }
        if(StringUtils.isEmpty(userLd.getPassword())){
            throw new BookStoreException(BookStoreException.CodeMsgEnum.USER_PASSWORD_IS_NULL);
        }
        EsUser esUser = userMapper.selectByUsername(userLd.getUsername());
        // 根据esUser是否存在进行判断
        if(esUser == null){
            // 说明用户不存在
            throw new BookStoreException(BookStoreException.CodeMsgEnum.USER_IS_NOT_EXIST);
        }
        if(!userLd.getPassword().equals(esUser.getPassword())){
            // 说明密码不匹配
            throw new BookStoreException(BookStoreException.CodeMsgEnum.USER_PASSWORD_ERROR);
        }
        // 以上判断如果都通过了，说明可以登陆，对esUser进行加密
        // 正常情况下加密一个id就够了，其余的数据都是锦上添花

        // 加密时候，放一个json格式的字符串
        String jwt = JsonWebTokenUtils.createJWT(String.valueOf(esUser.getId()),
                esUser.getUsername(),
                24 * 60 * 60 * 1000L);
        LoginReturnDTO loginReturnDTO = new LoginReturnDTO();
        loginReturnDTO.setJwt(jwt);

        return loginReturnDTO;
    }

    @Override
    public UserDTO getUserInfo(HttpServletRequest request) {
        // 要通过userId来查询用户信息
        // 从请求中取出userId，注意这里的类型转换
        String userId = (String) request.getAttribute("userId");
        // 调用dao层里的sql语句
        return userMapper.selectById(Integer.parseInt(userId));
    }

    @Override
    public void userRegister(UserRegisterDTO userRegisterDTO) {

        // 注册之前先检查一下这个用户名有没有被注册，如果有就不能注册
        // 如果没有就可以注册（加分）

        // 使用工具类将DTO中的数据复制到到esUser里
        EsUser esUser = BeanCopyUtils.copyBean(userRegisterDTO, EsUser.class);
        // 将没有默认值的数据手动添加一下
        // 注册时间为当前时间
        esUser.setRegisterTime(LocalDateTime.now());
        // 状态
        esUser.setStatus(0);
        // 角色
        esUser.setRoleId(2);
        // 是否是vip
        esUser.setIsVip(false);
        userMapper.insert(esUser);
    }

    @Override
    public void updatePassword(UpdatePasswordDTO updatePasswordDTO, HttpServletRequest request) {
        // 从请求中取出userId并且做类型转换
        Integer userId = Integer.parseInt((String) request.getAttribute("userId"));

        // 根据userId查出数据库里的密码
        // 比对一下旧密码（加分项）

        // 更新密码
        userMapper.updatePassword(updatePasswordDTO.getNewPassword(),userId);
    }

    @Override
    public void updateUser(UpdateUserDTO updateUserDTO) {
        // 更新之前应该先查询一下
        // 根据id
        UserDTO userDTO = userMapper.selectById(updateUserDTO.getId());
        if(userDTO == null){
            throw new BookStoreException(BookStoreException.CodeMsgEnum.USER_IS_NOT_EXIST);
        }
        userMapper.update(updateUserDTO);
    }
}
